Apache: архитектура, инсталиране, конфигуриране, виртуални хостове
Въведение
Оригиналната визия на Тим Бърнърс-Лий е била да създаде хипер-текстова система. Програма, с която не само могат да се създават форматирани документи, но и да има мрежова свързаност между всички тях (т.н. хипер-връзки).[1]
В модерно време, браузърът е главния компонент с който един потребител е запознат: "устройството" чрез което форматираните документи могат да се преглеждат и мрежови данни да се пренасят. Обаче зад всички уеб браузъри стоят едни по-важни системи: уеб сървърите.
Това са местата при които всички уебстраници се съхраняват, разпространяват и понякога генерират. Разбира се, първата реализация на световната мрежа от ЦЕРН е дошла с браузъри и сървър.[2] На фигура 1 е предоставена екранна снимка на точно този софтуер.[3]
С времето, разнообразни екипи разработили свои реализации. В едно бурно море от новости се зародил и Apache. Оригиналната цел е била един вече съществуващ сървър да се подобри, но с наслагването на подобрения и надстройки, нещо много по-съществено се случило.[4]
В днешно време, над 28% от всички уебсайтове се предоставят от Apache. Сред тях се включват едни от най-големите медийни доставчици: Netflix и Spotify, високо-класни университети като MIT и правителствени организации като Американския Национални институти на Здравеопазването.[5]
Инсталиране
За разлика от много други популярни софтуерни проекти, Apache не предоставя прекомпилирани изпълними файлове! Това, което те предоставят, е самият изходен код.[6] Всеки човек има свободата да го изтегли и сам да си го компилира.
Разбира се, не всеки има техническото знание, време и/или интерес да поеме такава задача. Затова голяма група ентусиасти споделят своите резултати с потребителите на всички популярни операционни системи. Все пак, в тази глава ще разгледаме и двете възможности.
Прекомпилирани изпълними файлове
Microsoft Windows
От над 15 години, Apache Lounge осигуряват изпълними файлове, които освен че са актуални, предоставят най-новите компилационни оптимизации и подобрения за Windows.[7] Инсталацията е като всяка друга под тази операционна система:
- Навигиране до уебстраницата им за изтегляне: www.apachelounge.com/download/
- Изтегляне най-скорошния наличен ZIP файлов архив
- Разрахивиране чрез някой разраховатор. По-модерни версии на Windows такъв уред е директно вграден.
- Следване стъпките в ReadMe.txt, почти винаги се свеждат до това се изтегли съответна версия на Visual C++ Redistributable for Visual Studio и да се преместят разрахивираните файлове.
Apple MacOS
Най-употребяваната система за инсталиране на потребителско-предоставени програми на MacOS се нарича Homebrew. Разбира се, екипът зад нея поддържат и Apache уеб-сървърът. Инсталацията се свежда до една проста команда:[8]
brew install httpd
Linux
Най-популярните безплатни операционни системи и главният избор за сървърни пространства са системи, базиран на Linux ядрото. Броят на активно-разработвани ОС от този клас наближава трицифрено число, поради което в тази секция ще се разгледат само най-популярните.[9] Обаче действието е практически същото при всички тях и наподобява този под MacOS: изпълнява се команда, извикваща вградения пакетен мениджър да изпълни работата.[10]
Ubuntu/Debian
sudo apt install -y apache2
CentOS/Red Hat Enterprise Linux
sudo yum install -y apache2
Gentoo
sudo emerge apache
Arch Linux
sudo pacman -S apache
Компилиране от изходния код
Microsoft Windows
Windows е най-употребяваната настолна операционна система. Нейният дизайн и архитектура е прецизно разработен да предоставя най-доброто потребителско изживяване за средния човек. За жалост, това е за сметка на изживяването на разработчици. Поради тази причина, стъпките са най-дълги:[11]
-
Изтегляне на зависимости:
- Microsoft Visual C++ 6.0 или по-нови
- perl и awk
-
Изтегляне на Unix източници (по-късно те ще бъдат настроени за употреба под Windows):
- Изтегляне и разрахивиране на сорс кода
- Изтегляне на APR, AR-Util и APR-Iconv и разархивриане съответно в
httpd-2.x.x\srclib
- Отваряне на команден ред и навигиране до директорията с разархивирания изходен код на Apache
-
Изпълняване на конвертиращия инструмент:
perl srclib\apr\build\lineends.pl -
Изпълняване на компилиращия скрипт:
nmake /f Makefile.win _apacher -
Изпълняване на инсталиращия скрипт:
nmake /f Makefile.win installr
MacOS/Linux
Поради приликите в архитектурите си и по-благоприятният дизайн за разработчици, стъпките за MacOS и Linux-базирани ОС са на практика идентични. Разбира се, пакетният мениджър чрез който се инсталират зависимости се различава, но на практика те винаги са инсталирани като зависимости на други програми. Стъпките са значително по-прости:[12]
- Изтегляне и разархивиране на изходния код
-
Конфигуриране на средата:
./configure -
Компилиране:
make -
Инсталиране:
sudo make install
Архитектура
Като всеки друг сървър, Apache работи като услуга: програма, която е оставена да се изпълнява на заден план. Първоначалното пускане е бавно, но след това самото изпълнение е бързо. В сървърна среда, най-често Apache е настроен да се пуска когато хардуера се включва.
Това което отличава Apache, особено спрямо неговата конкуренция в началото на съществуването си, е неговият модулярен дизайн. В самия софтуер присъства едно малко ядро, което действа повече като лепилото за модули.
Модулите съдържат същинските реализации на почти всички компоненти, които се използват от сървъра по време на експлоатация. Самите модули се зареждат по време на изпълнение, което означава че могат да се добавят и премахват без нужда от рестартиране.
Обаче, това изявява един проблем при писането на модули: всяка операционна система е различна и всеки модул ще трябва да се съобразява с нея. За щастие този проблем е елиминиран с друг жизненоважен компонент: Apache Portable Runtime (APR) библиотеки. Те стоят като посредник между операционните системи и модули, позволявайки модулна разработка да бъде преизползваема и лесна.
За жалост, това добавя още един проблем: ефикасност. APR библиотеките са малко на брой, и действат като бариери през които мрежовият трафик трябва да минава. Тази лимитация води до колосални забавяния в обработката на данни при онлайн страници със среден и голям брой посетители. Като решение на този проблем са сътворени Multi-Processing модулите (MPM).
На дадена машина може само един от тях да бъде пуснат, но той има силата да говори с ОС едновременно през APR и собствените ѝ интерфейси. Разбира се, ролята на такъв модул е добре дефинирана, затова в практиката The Apache Software Foundation са единствените разраотчици на този клас модули.[13]
Виртуални хостове
В една интернет мрежа, всяко хардуерно устройство се идентифицира чрез така наречен "Internet Protocol Address". Това е едно дълго число (често представяно като четири малки числа, разделени с точка), което по уникален начин идентифицира даден участник в мрежата.[14] Под контекста на уеб документи, този тип идентификация е полезна когато се говори за клиенти. Обаче, при доставчиците се оформя проблем: не можем от един и същ сървър да достъпим няколко "сайта", или по-точно, няколко документа под различно сървърно (домейн) име.
На ниво компютърни мрежи този проблем се оправя с портове, на ниво Apache този проблем се оправя с виртуални хостове. Виртуалния хост е една малка структура от данни, която описва релацията между определено сървърно име, достъпено на определен порт и документи на този сървър. Стандартно е портовете да са номер 80, когато потребителя се е свързал към сървъра по несигурен протокол, и 443 когато се е свързал по сигурен метод.
Разбира се, Apache позволява тази релация да бъде значително по-комплексна. В един виртуален хост може допълнително да се дефинират какви конкретни документи да се връщат спрямо върнатия сървърен статус, разнообразни ограничения на достъп, пренасочване. Дори се поддържа, в случаите когато една машина има няколко мрежови интерфейса и съответно общо няколко адреса, релация между сървърно име и порт + адрес.[15]
Конфигуриране
Конфигурационните файлове на Apache2 се намират под:
-
/etc/apache2или/etc/httpdдиректорията на Linux-базирани операционни системи, -
/usr/local/etc/httpdпод MacOS и -
C:\Program Files\Apache Software Foundation\ApacheX.Xпри Microsoft Windows (където X.X се определя от инсталираната версия на Apache).
apache2.conf (или httpd.conf, според директорията).[16]
Почти всяка настройка може да се декларира в него, обаче по конвенция се прави разделени на файлове.
Най-важните конфигурации за Apache са виртуалните хостове.
Файлове се създават и менижират в локациите sites-available и sites-enabled.
Под първата се въвеждат всички виртуални хостове, които машината би поддържала, обаче те не са активирани по никакъв начин.
В sites-enables от друга страна, са всички активни виртуални хостове.
Целта е всички настройки да се пишат в sites-available и чрез символичи връзки да се добавят и премахват от sites-enables.
Тази схема е много удобна и елегантно се вписва във файловите системи. Аналогично се употребяват:
-
conf-availableиconf-enabled, -
mods-availableиmods-enabled.
По-значимо, вторият описва модулите които са налични и са активни.
При модулите допълнително имаме подразделение на два типа файлове: единия завършващ на .load, описващ редовете, които вмъкват този модул; и другият завършващ на .conf, под който се съдържат конфигурации на самия модул.[17]
Широкото разбиване на конфигурации е направено по добра причина. Apache е разработвано от почти 30 години и в най-новата си версия предлага над 700 опции![18] Въпреки това са достатъчни само около дузина от тях за създаване на използваеми и стабилни конфигурации.
Синтаксис
Съществуват два типа опции в един конфигурационен файл, които ще наречем:
-
Примитивни, приличащи на извикване на команди:
Require all deniedOptions +IncludesErrorDocument 403 "Sorry, can't allow you access today"Require ldap-group cn=%{env:MATCH_SITENAME},ou=combined,o=Example -
Композитни, приличащи на
HTMLмаркиране и съдържащи примитивни и други композитни:<Directory "/"> AllowOverride None </Directory><Limit POST PUT DELETE> Require valid-user </Limit><VirtualHost 192.168.1.1 172.20.30.40> ServerName server.example.com ServerAlias server <Directory /var/www/example_com> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> </VirtualHost>
По конвенция, името на дадена опция е в PascalCase (Require, Directory, ...), но конкретно как изглеждат аргументи се определя от разработчика на опцията.
Глобални примитивни опции
Timeout [Цяло число (секунди)]Определя колко време Apache ще изчака за изпълнение на дадена заявка. По подразбиране е 60 секунди.
KeepAlive [Оn или Off]Позволява на един клиент (браузър) да поддържа връзка със сървъра, по която да прекарва няколко заявки. Ако е изключена, на всяка заявка ще трябва да се установи наново връзка. По подразбиране е "On"
KeepAliveTimeout [Цяло число (милисекунди)]Колко време да се изчака между изпращане на две заявки по една връзка, преди връзката да се прекрати. По подразбиране е 5 милисекунди.
MaxKeepAliveRequests [Цяло число (бройка)]Максималния брой заявки, които могат да се направят по една връзка преди връзката да се затвори. Ако е 0, неограничен брой заявки са позволени! По подразбиране е 100.
Опции за виртуални хостове
<VirtualHost [адрес:порт адрес:порт ...]>-
Определя един виртуален хост, който се достъпва на даденият(ите) адрес(и).
<VirtualHost 10.1.2.3:80> ... </VirtualHost>
Останалите опции се вписват в VirtualHost:
ServerName [URL адрес]-
Свързва адресът към който заявката е изпратена, т.е. URL-ът от който браузърът се цели да изтегли уебстраници.
ServerName www.example.com ServerAlias [Имена на хостове]-
Позволява алтернативни хост имена за
ServerName. Особено полезно в ситуации в които няколко виртуални хоста имат еднакви сървърни имена. Приема само името на хоста, не приема порт, IP адреси, ...ServerAlias server server2.example.com server2 DocumentRoot [Път към директория]-
Определя директорията в която се съдържат уебстраниците, достъпни през дадения виртуален хост.
DocumentRoot "/var/www/example_site" Alias [URL път] [Път към директория/файл]-
Позволява достъпването на файлове/директории, които се намират извън
DocumentRoot.Alias "/image" "/ftp/pub/image" <Directory [Път към директория]>-
Слага/вдига ограничения към директория (и нейнитя под-файлове и под-директории). Apache има свободен достъп към само една директория (посочена по време на компилация, но често
/var/www). За всички останали трябва да се постави тази опция.<Directory "/usr/local/httpd/htdocs"> ... </Directory>Най-простата (и опасна) "вътрешна" примитивна опция е
Require all granted, позволяваща безусловен достъп към директорията. Останалите опции и аргументи няма да бъдат разглеждани. Redirect [Статус] [URL път] [URL адрес]-
Създава пренасочване от стар URL път към нов URL адрес. Така се позволява пренасочванията да бъдат към страница в същия виртуален хост/сървър или към друг напълно различен. Стойността на
[Статус]може да бъде една от:permanent(статус код 301)temp(статус код 302)seeother(статус код 303)gone(статус код 410)
Позволено е и да се изпусне, в чийто случай ще се зачете за
temp. Ако се избереgone, последния аргумент не трябва да се подаде.Redirect "/service" "http://foo2.example.com/service"Redirect permanent "/one" "/two" ErrorDocument [Статус код на грешка] [Документ; низ, URL адрес или път към файл]-
В случай на грешка, връща посочения "документ" вместо вграденото съобщение. Документът може да бъде низ, адрес към URL (в който случай ще се изпълни пренасочване) или път към файл (в който случай файлът ще бъде върнат като отговор).
ErrorDocument 500 http://example.com/cgi-bin/server-error.cgiErrorDocument 401 /subscription_info.htmlErrorDocument 403 "Sorry, can't allow you access today"
Източници
- Tim Berners-Lee, "WorldWideWeb: Proposal for a HyperText Project", публикувано 12 Ноември 1990, последно посетено 30.11.2024, http://info.cern.ch/hypertext/WWW/Proposal.html
- Tim Berners-Lee, "WorldWideWeb wide-area hypertext app available", публикувано 20 Август 1991, последно посетено 30.11.2024, https://groups.google.com/g/comp.sys.next.announce/c/avWAjISncfw?pli=1
- CERN, "World Wide Web images gallery", публикувано, последно посетено 30.11.2024, https://home.cern/resources/image/computing/world-wide-web-images-gallery
- The Apache Software Foundation, "About Apache", публикувано, последно посетено 30.11.2024, https://httpd.apache.org/ABOUT_APACHE.html
- W3Techs, "Usage statistics of Apache", публикувано 3 Януари 2023, последно посетено 30.11.2024, https://w3techs.com/technologies/details/ws-apache
- The Apache Software Foundation, "Apache HTTP Server Documentation", версия 2.4, последно посетено 30.11.2024, страница "Using Apache HTTP Server on Microsoft Windows", https://httpd.apache.org/docs/current/platform/windows.html
- Apache Lounge, "Apache 2.4 VS17 Windows Binaries and Modules", публикувано, последно посетено 30.11.2024, https://www.apachelounge.com/download/
- Homebrew Formulae, "httpd", публикувано, последно посетено 30.11.2024, https://formulae.brew.sh/formula/httpd
- TrueList, "Linux Statistics - 2024", публикувано 17 Февруари 2024, последно посетено 30.11.2024, https://truelist.co/blog/linux-statistics/
- DigitalOcean, "How To Install Apache", публикувано, последно посетено 30.11.2024, https://www.digitalocean.com/community/tutorial-collections/how-to-install-apache
- The Apache Software Foundation, "Apache HTTP Server Documentation", версия 2.4, последно посетено 30.11.2024, страница "Compiling Apache for Microsoft Windows", https://httpd.apache.org/docs/current/platform/win_compiling.html
- The Apache Software Foundation, "Apache HTTP Server Documentation", версия 2.4, последно посетено 30.11.2024, страница "Compiling and installing", https://httpd.apache.org/docs/current/install.html
- Nick Kew, "Apache Modules Book, The: Application Development with Apache", 1во издание, публикувано 26 Януари 2007, глава "The Apache Platform and Architecture", https://www.informit.com/articles/article.aspx?p=705689
- Information Sciences Institute, University of Southern California, "DOD STANDARD INTERNET PROTOCOL", 1во издание, публикувано Януари 1980, https://datatracker.ietf.org/doc/html/rfc760
- Ken A. L. Coar, Rich Bowen, "Apache Cookbook", 1во издание, публикувано 28 Ноември 2003, глава 4 "Virtual Hosts", https://www.oreilly.com/library/view/apache-cookbook/0596001916/ch04.html
- Anthony Heddings, "How to Find Your Apache Configuration Folder", публикувано, последно посетено 06.12.2024, https://www.howtogeek.com/devops/how-to-find-your-apache-configuration-folder/
- Justin Ellingwood, "How To Configure the Apache Web Server on an Ubuntu or Debian VPS", публикувано, последно посетено 06.12.2024, https://www.digitalocean.com/community/tutorials/how-to-configure-the-apache-web-server-on-an-ubuntu-or-debian-vps
- The Apache Software Foundation, "Apache HTTP Server Documentation", версия 2.4, последно посетено 23.12.2024, страница "Directive Index", https://httpd.apache.org/docs/current/mod/directives.html
- The Apache Software Foundation, "Apache HTTP Server Documentation", версия 2.4, последно посетено 23.12.2024, страница "Apache Core Features", https://httpd.apache.org/docs/current/mod/core.html